﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Guoc.DAL.Service;
using Guoc.DAL.Domain;
using Guoc.DAL.Interface;
using Guoc.DAL.CastleIOC;
using Guoc.DAL.Common;
using NHibernate;
using Moq;
namespace Guoc.Web.Test.DAL.ServiceTest
{
    /// <summary>
    /// EmployeeSerivceTest 的摘要说明
    /// </summary>
    [TestClass]
    public class EmployeeSerivceTest
    {
        public EmployeeSerivceTest()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///获取或设置测试上下文，该上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 附加测试特性
        //
        // 编写测试时，可以使用以下附加特性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前，使用 TestInitialize 来运行代码
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在每个测试运行完之后，使用 TestCleanup 来运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]        
        public void GetEmployee_return_an_employee_instance_if_userName_exist()
        {
            string userName = "admin";
            EmployeeSerivce empSerivce = new EmployeeSerivce();
            Employee actEmp = empSerivce.GetEmployee(userName);           
 
            Assert.IsNotNull(actEmp);
            Assert.AreEqual("admin", actEmp.LoginName);
            Assert.AreEqual("123", actEmp.LoginPwd);
        }

        [TestMethod]
        public void GetEmployee_return_employeeID_is_string_empty_if_userName_not_exists()
        { 
            //如果该用户名找不到，返回对象employee 的ID 为null
            string userName = "xhx";
            EmployeeSerivce empSerivce = new EmployeeSerivce();
            Employee actEmp = empSerivce.GetEmployee(userName);

            Assert.IsNotNull(actEmp);
            Assert.AreEqual(null, actEmp.ID);
            Assert.AreEqual(null, actEmp.LoginName);
        }

       
        [TestMethod]
        public void Insert_return_an_newID_if_input_employee()
        {
            Employee newEmp = new Employee();
            newEmp.ID = Guid.NewGuid().ToString();
            newEmp.LoginName = "sys8";
            newEmp.LoginPwd = "123456";
            newEmp.RealName = "系统管理员";
            newEmp.IsDelete = 0;
            newEmp.State = 1;  //1 有效
            
         

            EmployeeSerivce empSerivce = new EmployeeSerivce();
            ISession INHSession = empSerivce.CurrentSession;
            ITransaction itran = INHSession.BeginTransaction();
            //执行
            object actualID= empSerivce.Create(newEmp);
            
            //取出信息断言
            Employee acEmp= empSerivce.GetList().Where(e => e.ID == actualID.ToString()).First();
            Assert.IsNotNull(acEmp);
            //断言
            Assert.AreEqual(acEmp.ID, actualID);
            Assert.AreEqual(newEmp.LoginName, acEmp.LoginName);
            Assert.AreEqual(newEmp.LoginPwd, acEmp.LoginPwd);
            //断言完毕，要回滚事务。撤销添加的数据
            itran.Rollback();
            itran.Dispose();
            NhibernateHelper.CloseSession();
        }

        [TestMethod]
        public void Update_if_input_an_employee() 
        {
            Employee emp = new Employee();
            emp.ID = Guid.NewGuid().ToString();
            emp.LoginName = "admin3";
            emp.LoginPwd = "321";

            EmployeeSerivce empService = new EmployeeSerivce();
            using (empService.CurrentSession.BeginTransaction())
            {
                empService.Update(emp);

                Employee editEmp = empService.Get(emp.ID);

                Assert.IsNotNull(editEmp);
                Assert.AreEqual(emp.LoginName, editEmp.LoginName);
                Assert.AreEqual(emp.LoginPwd, editEmp.LoginPwd);

                //撤销回滚
            }


        }


       
    }
}
